package main

import "fmt"

func main() {
	// num := 20
	// testChange(num)
	// fmt.Println("main() num = ", num)
	// n := 20
	// fmt.Println("before invoke n = ", n)
	// test02(&n)
	// fmt.Println("after invoke n = ", n)
	// a := getSum
	// // fmt.Printf("a的类型为%T,getSum的类型为%T \n", a, getSum)
	// // num := a(8, 9)
	// // fmt.Println("num=", num)
	// res2 := myfunc(a, 10, 20)
	// fmt.Println("res2=", res2)

	// type myint int
	// var n1 myint
	// var n2 int
	// n1 = 40
	// n2 = 40
	// fmt.Printf("n1类型为%T 值为%d\n", n1, n1)
	// fmt.Printf("n2类型为%T 值为%d\n", n2, n2)
	// n3 := n1 + myint(n2)
	// fmt.Printf("n3类型为%T 值为%d\n", n3, n3)

	// res3 := myFun2(getSum, 500, 600)
	// fmt.Println("res3=", res3)

	// sum, sub := getSumAndSub(-1, 5)
	// fmt.Printf("sum=%d,sub=%d \n", sum, sub)

	//忽略返回值
	// sum, _ := getSumAndSub(-15, 15)
	// fmt.Printf("sum=%d\n", sum)

	//func支持可变参数
	i := sum(10, 20, 30, -1)
	fmt.Printf("i = %d", i)
}

func sum(num1 int, args ...int) int {
	sum := num1
	for i := 0; i < len(args); i++ {
		sum += args[i]
	}
	return sum
	// panic("unimplemented")
}

//直接对返回值命名
// func getSumAndSub(n1, n2 int) (sum, sub int) {
// 	sum = n1 + n2
// 	sub = n1 - n2
// 	return
// }

//自定义方法类型
// type myFuncType func(int, int) int

// func myFun2(funcvar myFuncType, num1, num2 int) int {
// 	return funcvar(num1, num2)
// }

// func myfunc(a func(num1 int, num2 int) int, i1, i2 int) int {
// 	// panic("unimplemented")
// 	return a(i1, i2)
// }

// func getSum(num1, num2 int) int {
// 	return num1 + num2
// }

// func testChange(num int) {
// 	num = num + 10
// 	fmt.Println("test num = ", num)
// }

// func test02(n *int) {
// 	*n = *n + 10
// 	fmt.Println("test02 n = ", n)
// }
